package Trab.ES1.Modelos;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 *
 * @author Grupo H
 */

public class Receita implements Comparable<Receita>
{
    private String nome;
    private String descricao;
    private float nota;
    private float dificuldade;
    private int tempoPreparo;
    private Usuario autor;
    private List<Ingrediente> ingredientes;
    private List<Categoria> categorias;    
    private List<Comentario> comentariosNaReceita;
    private List<Observador> observadores;

    public Receita(String nome, String descricao, Usuario autor, int tempoPreparo)
    {
        this.nome = nome;
        this.descricao = descricao;
        this.autor = autor;
        this.tempoPreparo = tempoPreparo;
        this.nota = 0f;
        this.dificuldade = 0f;
        this.ingredientes = new ArrayList<>();
        this.categorias = new ArrayList<>();
        this.comentariosNaReceita = new ArrayList<>();
        this.observadores = new ArrayList<>();
    }
    
    /**
     * @return the nome
     */
    public String getNome() 
    {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) 
    {
        this.nome = nome;
    }

    /**
     * @return the descricao
     */
    public String getDescricao() 
    {
        return descricao;
    }

    /**
     * @param descricao the descricao to set
     */
    public void setDescricao(String descricao)
    {
        this.descricao = descricao;
    }

    /**
     * @return the nota
     */
    public float getNota() 
    {        
        return nota;
    }

    /**
     * @param nota the nota to set
     */
    public void setNota(float nota) 
    {
        this.nota = nota;
        this.notificaObservadores();
    }

    /**
     * @return the dificuldade
     */
    public float getDificuldade() 
    {
        return dificuldade;
    }

    /**
     * @param dificuldade the dificuldade to set
     */
    public void setDificuldade(float dificuldade)
    {
        this.dificuldade = dificuldade;
    }

    /**
     * @return the ingredientes
     */
    public List<Ingrediente> getIngredientes() 
    {
        return ingredientes;
    }

    /**
     * @return the categorias
     */
    public List<Categoria> getCategorias() 
    {
        return categorias;
    }

    /**
     * @return the autor
     */
    public Usuario getAutor() {
        return autor;
    }

    /**
     * @return the comentariosNaReceita
     */
    public List<Comentario> getComentariosNaReceita() 
    {
        return comentariosNaReceita;
    }
    
    public int getTempoPreparo()
    {
        return tempoPreparo;
    }
        
    @Override
    public boolean equals(Object o)
    {
        Receita receitaSendoComparada = (Receita) o;
        return this.getNome().equalsIgnoreCase(receitaSendoComparada.getNome()) && this.getAutor().equals(receitaSendoComparada.getAutor());
    }

    @Override
    public int hashCode() 
    {
        int hash = 7;
        hash = 29 * hash + Objects.hashCode(this.getNome());
        hash = 29 * hash + Objects.hashCode(this.getAutor());
        return hash;
    }

    @Override
    public int compareTo(Receita o) 
    {
        if(this.getNota() > o.getNota())
            return -1;
        else if(this.getNota() < o.getNota())
            return 1;
        return 0;
    }
    
    public String getNomesIngredientes()
    {
        String resp = "";
        for(Ingrediente i: this.getIngredientes())
            resp += i.getNome()+"\n";
        return resp;
    }

    public String getNomesCategorias() 
    {
        String resp = "";
        for(Categoria c: this.getCategorias())
            resp += c.getNome()+"\n";
        return resp;
    }
    
    public void notificaObservadores()
    {
        for(Observador o: this.observadores)
            o.atualiza();
    }
    
    public void adicionaObservador(Observador o)
    {
        this.observadores.add(o);
    }
    
    public void removeObservador(Observador o)
    {
        this.observadores.remove(o);
    }
}
